package yunai.bio;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: DRevelation
 * @Date: 2021/10/13 14:49
 * <p>
 * IO 也称为 BIO，Block IO 阻塞同步的通讯方式
 * 比较传统的技术，实际开发中基本上用Netty或者是AIO。熟悉BIO，NIO，体会其中变化的过程。作为一个web开发人员，stock通讯面试经常问题。
 * BIO最大的问题是：阻塞，同步。
 * BIO通讯方式很依赖于网络，若网速不好，阻塞时间会很长。每次请求都由程序执行并返回，这是同步的缺陷。
 * BIO工作流程：
 * 第一步：server端服务器启动
 * 第二步：server端服务器阻塞监听client请求
 * 第三步：server端服务器接收请求，创建线程实现任务
 */
@Slf4j
public class BIOServer {
    private static final int PORT = 8888;

    public static void main(String[] args) {
        ServerSocket server = null;
        Socket socket = null;

        ExecutorService executor = null;

        try {
            server = new ServerSocket(PORT);
            log.info("BIO Server 服务器启动...");
            //传统的新增线程处理
//            while (true) {
//                socket = server.accept();
//                log.info("Server 服务器确认请求...");
//                new Thread(new BIOServerHandler(socket)).start();
//            }
            executor = new ThreadPoolExecutor(10, 100, 100,
                    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
            while (true) {
                socket = server.accept();
                BIOServerHandler serverHandler = new BIOServerHandler(socket);
                executor.execute(serverHandler);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != socket) {
                    socket.close();
                }
                if (null != server) {
                    server.close();
                    log.info("BIO Server服务器关闭了!!!");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
